2018年12月15日

本日の内容(案)

  1. 振り返り
    • なぜPythonでなくRを使うのか?
    • Reproducible Research
    • Tidy Data
    • Data Science Workflow
      • Program
      • Import
      • Tidy/Transform
      • Visualize
      • Communicate
  2. おまけ

 

振り返り

なぜPythonでなくRを使うのか

Six Reasons To Learn R For Business, R Blogger

  1. R Has The Best Overall Qualities
  2. R Is Data Science For Non-Computer Scientists
  3. Learning R Is Easy With The Tidyverse
  4. R Has Brains, Muscle, And Heart
    • Cutting-edge algorithms and Powerful tools (packages)
  5. R Is Built For Business
    • R Markdown
  6. R Community Support

Reproducible Research

  • データから分析結果が再現できること
  • 同じデータから同じ結果が得られることは科学的知見の蓄積において重要
  • 過去の分析を見直した時に何をやっているか理解できることも重要
    • その場限りの分析では知見の蓄積にならない
  • 文書化(記録)されない手作業(データ整形、コピペなど)が再現性を阻害する
    • 人の記憶は絶対じゃない、手作業では間違いが混入しやすい

Tidy Data

乱暴に言うと「Coddの第三正規形」を満たすデータ(対義語はMessy Data)。

  • Each variable forms a column.
  • Each observation forms a row.
  • Each type of observational unit forms a table.
  • Each value is a cell.

日本語では以下となり、構造と意味が一致しているデータをTidy Dataと呼びます。

  • 個々の変数が1つの列をなす
  • 個々の観測が1つの行をなす
  • 個々の観測の構成単位の類型が1つの表をなす
  • 個々の値が1つのセルをなす

Data Science Workflow

Program

開発環境

  • Rを使うのであればIDEとしてRStudioを使うのがベストです
    • RやR Markdownのコーディングに最適化
    • プロジェクト単位でのファイル・パッケージ管理が可能
    • Git/SVNなどのVCSとの連携が可能

 

  • 日本語環境を快適に使うにはWinodwsは非推奨です
    • OS自体がいまだにSJIS(CP932)を利用しているので日本語処理に難がある
      • Windows環境ならDockerでRStudio Serverを動かす方がベター
    • mac OS または linux(Ubuntu)などUTF-8ベースのOSでの利用を推奨

RStuido Tips

RStudioを利用する場合はR MarkdownのR Notebook機能を活用すると実結果を確認するためにknitする必要がなく分析が早く分かりやすくなります。

  • R Notebook機能 - chunkの下に実行結果を表示する機能

R Notebook機能を上手に活用するには[Ctrl + Enter]と[Ctrl + Shift + Enter]のショートカットキーを利用します。

  • [Ctrl + Enter] - カーソルがある部分、または、選択部分を実行する
  • [Ctrl + Shift + Enter] - カーソルがあるchunk全体を実行する

コードがパイプでつながっている場合は、[Ctrl + Enter]でも一連のコードを実行してくれます。

Import

データストア

  • データストアに対してSQLアクセスが利用できるのがベスト
    • SQLアクセスが利用できない場合はAPIアクセス
    • APIアクセスが利用できない場合はスクレイピング
    • スクレイピングが利用できない場合はファイル入力
  • データストアにファイルを使う必要があるならMySQL

Tidy/Transform

Dataset

iris

tidyr::gather

tidyr::gather関数は、keyに変数名をvalueにその値をまとめます。

iris %>% tidyr::gather(key = "Part", value = "Value", -Species) %>% head()

tidyr::spread

tidyr::spread関数はkeyを変数名にvalueをその値として展開します。

iris %>% tibble::rowid_to_column("id") %>% 
  tidyr::gather(key = "Part", value = "Value", -id, -Species) %>% 
  tidyr::spread(key = Part, value = Value) %>% dplyr::select(-id) %>% head()

表示順を変えたい(forcats)

iris %>% ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Width)) +
    ggplot2::geom_boxplot(ggplot2::aes(colour = Species))

中央値順に並べ替える(forcats)

iris %>% dplyr::mutate(Species = forcats::fct_reorder(Species, Sepal.Width)) %>%
  ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Width)) +
    ggplot2::geom_boxplot(ggplot2::aes(colour = Species))

purrrは何ができるのか?

purrr::map関数は指定した引数に対して指定した処理(関数、演算子など)を適用する関数ですので、繰り返し処理に威力を発揮します。例えば、

  • 多数のファイルを読込んで結合する
file_path %>% list.files(path = ., pattern = "(issues_)", full.names = TRUE) %>% 
  purrr::map_df(.x = ., .f = readr::read_csv, locale = readr::locale(encoding = "cp932"))
  • 因子水準ごとに処理を適用する
iris %>% split(.$Species) %>% 
  purrr::map_df(~ lm(Sepal.Length ~ Sepal.Width, data = .x) %>% broom::tidy(),
                .id = "Species")
  • データフレーム内のリストを処理する(第6回で実施)

リスト処理の前に

c関数はベクトル型変数やリスト型変数をcombine(結合)する関数。

c(issue_id = 16451L, list(id = 2L, name = "Resolution", value = "Invalid"))
## $issue_id
## [1] 16451
## 
## $id
## [1] 2
## 
## $name
## [1] "Resolution"
## 
## $value
## [1] "Invalid"

purrr::map

第6回で説明したpurrr::map_df関数を使った カスタムフィールドの展開

with(issues, purrr::map_df(.x = custom_fields, .f = function(.x) {c(.x)}))

以下の処理と等価です(なお、c関数がなくても結果は同じです)。

dplyr::bind_rows(
  c(list(id = 2L, name = "Resolution", value = "Invalid")),
  c(list(id = 4L, name = "Affected version")) )

purrr::map2

第6回で説明したpurrr::map2_df関数を使った カスタムフィールドの展開

with(issues, purrr::map2_df(.x = id, .y = custom_fields,
                            .f = function(.x, .y) {c(issue_id = .x, .y)}))

以下の処理と等価です。

dplyr::bind_rows(
  c(issue_id = 16451L, list(id = 2L, name = "Resolution", value = "Invalid")),
  c(issue_id = 16451L, list(id = 4L, name = "Affected version")) )

Visualize

ggplot2::aesの中か外か?

iris %>% ggplot2::ggplot(ggplot2::aes(x = Species, fill = Species)) + 
  ggplot2::geom_boxplot(ggplot2::aes(y = Sepal.Length), alpha = 0.5)

ggplot2::aesの中か外か?

iris %>% ggplot2::ggplot(ggplot2::aes(x = Species, fill = Species)) + 
  ggplot2::geom_boxplot(ggplot2::aes(y = Sepal.Length, alpha = 0.5))

サイズやシンボル(シェイプ)を変える

iris %>% ggplot2::ggplot(ggplot2::aes(x = Petal.Width, y = Petal.Length)) + 
  ggplot2::geom_point(ggplot2::aes(colour = Species, size = Sepal.Length, shape = Species))

flexdashborad

flexdashboradの区切りはMarkdownのHeader記述(###)で代用できます。幅は合計が1,000になるようにするといい塩梅です。メニューは#レベルを記述すれば自動的にメニューとなり、タブはカラムやローレベル(##)で明示的に指定する必要があります。 テンプレート例

# Menu (Tab)

## Coloumn Left {data-width=650}

### Component

## Coloumn Rigth {data-width=350} {.tabset}

### Tab 1

### Tab 2

htmlwidgets

htmlwidgets はHTMLドキュメントでJavaScriptを用いてインタラクティブな表示を提供するためのベースとなるパッケージです。htmlwidgetsパッケージを利用した様々なパッケージが公開されています。代表的なパッケージには以下のようなものがあります。

package description
DT DataTablesライブラリを用いたテーブル(表)表示
plotly ggplot2オブジェクトを簡単にインタラクティブ化
dygraphs dygraphsライブライを用いた時系列グラフに特化したパッケージ

Package DT

mtcars %>% DT::datatable(options = list(pageLength = 5))

 

Package plotly

(iris %>% ggplot2::ggplot(ggplot2::aes(x = Petal.Width, y = Petal.Length)) +
           ggplot2::geom_point(ggplot2::aes(colour = Species))) %>% plotly::ggplotly()

Packages dygraphs

xts::as.xts(nhtemp) %>% dygraphs::dygraph(main = "New Haven Temperatures") %>% 
  dygraphs::dyRangeSelector()

おわりに

復習のためのリソース

  • Project Cabinet
  • Project Cabinet Blog

Enjoy!

CC BY-NC-SA 4.0, Sampo Suzuki